<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>promise的all方法</title>
</head>
<body>
  <script>
    // promise.all()方法用于将多个Promise实例，包装成一个新的promise
    var p1 = new Promise((resolve, reject) => {
      if (true){
       resolve('p1');
      } else {
       reject(error);
      }
    })
    var p2 = new Promise((resolve, reject) => {
      if (true){
       resolve('p2');
      } else {
       reject(error);
      }
    })
    var p3 = new Promise((resolve, reject) => {
      if (true){
       resolve('p3');
      } else {
       reject(error);
      }
    })
    var p = Promise.all([p1, p2, p3]);
    console.log('p', p) // 本质上还是一个对象

    // 上面代码中，promise.all方法接受一个数组作为参数，p1,p2,p3都是Promise实例
    /**
     * 如果不是，就会先调用下面讲到的Promise.resolve方法将参数转换为Promise实例，再进一步处理
     * 另外，Promise.all()方法的参数可以不是数组，但是必须具有Iterator接口，且返回的每个成员都是Promise对象
     * p的状态由p1,p2,p3决定，分俩种情况：
     *
     * 1. 只有p1,p2,p3的状态都变为fufilled，p的状态才会变成fufilled,此时p1,p2,p3的返回值组成一个数组，传递给p的回调函数
     *
     * 2.只要有一个被rejected，p的状态就会变成rejected，此时第一个被rejected的实例的返回值，会传递给p的回调函数
    */
   // 生成一个Promise对象的数组
   var promise = [2,3,5,7,11,13].map((id) => {
     return '我是' + id
   });
   Promise.all(promise).then((res) => {
     console.log('res', res)
   }).catch((err) => {
     console.log(err)
   })
   //上面代码中，promises是包含 6 个 Promise 实例的数组，
  //  只有这 6 个实例的状态都变成fulfilled，或者其中有一个变为rejected，才会调用Promise.all方法后面的回调函数。

  // 注意，如果作为参数的 Promise 实例，自己定义了catch方法，那么它一旦被rejected，并不会触发Promise.all()的catch方法。
  // 如果p2没有自己的catch方法，就会调用Promise.all()的catch方法。
  </script>
</body>
</html>